Design system.
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

127 lines
3.0 KiB

  1. import type {GetStaticPaths, GetStaticProps, NextPage} from 'next';
  2. import * as React from 'react'
  3. import {useRouter} from 'next/router';
  4. import ReactMarkdown from 'react-markdown';
  5. import {DocsLayout, Page} from '@/components/DocsLayout';
  6. import {getDocs, getMainReadmeFileContents, getPlatforms} from '@/utils/data';
  7. export interface Props {
  8. componentPages: { name: string; components: Page[] }[],
  9. docsPages: Page[],
  10. examplePages: Page[],
  11. platforms: any,
  12. markdown: string,
  13. }
  14. const InnerPage: NextPage<Props> = ({
  15. componentPages,
  16. examplePages,
  17. docsPages,
  18. platforms,
  19. markdown,
  20. }) => {
  21. const router = useRouter();
  22. const sidebarOpen = router.query.open === 'sidebar';
  23. return (
  24. <DocsLayout
  25. componentPages={componentPages}
  26. examplePages={examplePages}
  27. docsPages={docsPages}
  28. platforms={platforms}
  29. sidebarOpen={sidebarOpen}
  30. >
  31. {markdown && (
  32. <ReactMarkdown
  33. className="my-12 leading-loose"
  34. components={{
  35. ul: ({node, ordered: _ordered, ...props}) => (
  36. <ul
  37. {...props}
  38. className="list-disc pl-4"
  39. />
  40. ),
  41. li: ({node, ...props}) => (
  42. <li
  43. {...props}
  44. className="list-item pl-4"
  45. />
  46. ),
  47. }}
  48. >
  49. {markdown}
  50. </ReactMarkdown>
  51. )}
  52. <pre>
  53. <code>
  54. {JSON.stringify(componentPages, null, 2)}
  55. </code>
  56. </pre>
  57. </DocsLayout>
  58. )
  59. }
  60. export const getStaticProps: GetStaticProps = async (ctx) => {
  61. const { params } = ctx;
  62. const { url } = params as { url: string[] };
  63. const props = {} as Record<string, unknown>;
  64. const DOCS_MAPPING = {
  65. '/docs/philosophy': 'docs/00-philosophy.md',
  66. }
  67. const theUrl = ['', 'docs', ...url].join('/');
  68. const theDocFileUrl = DOCS_MAPPING[theUrl as keyof typeof DOCS_MAPPING] ?? theUrl;
  69. props.markdown = await getMainReadmeFileContents(theDocFileUrl) ?? null;
  70. props.platforms = await getPlatforms();
  71. props.docsPages = await getDocs({
  72. deriveHrefFromFilename: d => `/docs/${
  73. d
  74. .replace(/\.md/i, '')
  75. .split('-')
  76. .slice(1)
  77. .join('-')
  78. }`,
  79. deriveLabelFromFilename: d => (
  80. d
  81. .split('-')
  82. .slice(1)
  83. .map((dd) => dd.slice(0, 1).toUpperCase() + dd.slice(1))
  84. .join(' ')
  85. .replace(/\.md/i, '')
  86. ),
  87. });
  88. return {
  89. props,
  90. };
  91. };
  92. export default InnerPage;
  93. export const getStaticPaths: GetStaticPaths = async () => {
  94. const docsPages = await getDocs({
  95. deriveHrefFromFilename: d => `/docs/${
  96. d
  97. .replace(/\.md/i, '')
  98. .split('-')
  99. .slice(1)
  100. .join('-')
  101. }`,
  102. deriveLabelFromFilename: d => (
  103. d
  104. .split('-')
  105. .slice(1)
  106. .map((dd) => dd.slice(0, 1).toUpperCase() + dd.slice(1))
  107. .join(' ')
  108. .replace(/\.md/i, '')
  109. ),
  110. });
  111. return {
  112. paths: docsPages.map((d) => d.href),
  113. fallback: true,
  114. };
  115. };